package com.xjgc.webservice.ao.sap;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.xjgc.webservice.XParam;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 接收SAP传入:ZXJ_MES_EBELN
 * 采购订单行明细
 *
 * @author: 小逗号
 * @date: 2023-11-22
 * @description:
 * @since:
 */
@Data
@Slf4j
@XStreamAlias("REQUEST_DATA")
public class ZxjMesEbelnAO extends XParam {


    @Override
    protected List<?> dataList() {
        Map<String, Head> map = new HashMap<>(4);
        for (ZxjMesEbelnAO.ZxjMesEbeln zxjSrmEbeln : ebelnList) {
            //提取行信息
            Item item = new Item(zxjSrmEbeln);
            String ebeln = zxjSrmEbeln.getEbeln();
            //如果还没有抬头,提取抬头信息
            if (!map.containsKey(ebeln)) {
                Head head = new Head(zxjSrmEbeln);
                map.put(ebeln, head);
            }
            //行关联抬头
            Head head = map.get(ebeln);
            List<Item> itemList = head.getItemList();
            itemList.add(item);
        }
        //返回抬头(包含行)List
        List<Head> list = new ArrayList<>();
        for (Map.Entry<String, Head> entry : map.entrySet()) {
            Head value = entry.getValue();
            list.add(value);
        }
        return list;
    }

    /**
     * 接收数据<ITEM></ITEM>
     */
    @XStreamImplicit(itemFieldName = "ITEM")
    private List<ZxjMesEbelnAO.ZxjMesEbeln> ebelnList;

    /**
     * 行明细
     */
    @Data
    class ZxjMesEbeln implements Serializable {

        private static final long serialVersionUID = 1L;

        /**
         * 采购凭证号
         */

        @XStreamAlias("EBELN")
        private String ebeln;
        @XStreamAlias("EKORG")
        private String ekorg;

        /**
         * 采购凭证的项目编号
         */

        @XStreamAlias("EBELP")
        private String ebelp;

        /**
         * 订单类型（采购）
         */

        @XStreamAlias("BSART")
        private String bsart;

        /**
         * 供应商或债权人的帐号
         */

        @XStreamAlias("LIFNR")
        private String lifnr;

        /**
         * 供应商名称
         */

        @XStreamAlias("GYSMC")
        private String gysmc;

        /**
         * 公司代码
         */

        @XStreamAlias("BUKRS")
        private String bukrs;

        /**
         * 采购组
         */

        @XStreamAlias("EKGRP")
        private String ekgrp;

        /**
         * 采购订单日期
         */

        @XStreamAlias("BEDAT")
        private String bedat;

        /**
         * 创建对象的人员名称
         */

        @XStreamAlias("ERNAM")
        private String ernam;

        /**
         * 工厂
         */

        @XStreamAlias("WERKS")
        private String werks;

        /**
         * 工厂名称
         */

        @XStreamAlias("ZGCMC")
        private String zgcmc;

        /**
         * 科目分配类别
         */

        @XStreamAlias("KNTTP")
        private String knttp;

        /**
         * 销售和分销凭证号
         */

        @XStreamAlias("VBELN")
        private String vbeln;

        /**
         * 销售凭证项目
         */

        @XStreamAlias("VBELP")
        private String vbelp;

        /**
         * 物料号
         */

        @XStreamAlias("MATNR")
        private String matnr;

        /**
         * 物料描述
         */

        @XStreamAlias("TXZ01")
        private String txz01;

        /**
         * 采购订单数量
         */

        @XStreamAlias("MENGE")
        private BigDecimal menge;

        /**
         * 基本计量单位
         */

        @XStreamAlias("MEINS")
        private String meins;

        /**
         * 基本计量单位
         */

        @XStreamAlias("LMEIN")
        private String lmein;

        /**
         * 以采购订单货币计的订单总价值
         */

        @XStreamAlias("BRTWR")
        private String brtwr;

        /**
         * 采购订单货币的订单净值
         */

        @XStreamAlias("ZNETPR")
        private String znetpr;

        /**
         * 订单价格单位（采购）
         */

        @XStreamAlias("BPRME")
        private String bprme;

        /**
         * 项目交货日期
         */

        @XStreamAlias("EINDT")
        private String eindt;

        /**
         * 销售税代码
         */

        @XStreamAlias("MWSKZ")
        private String mwskz;

        /**
         * 收货数量
         */

        @XStreamAlias("WEMNG")
        private BigDecimal wemng;

        /**
         * 已开票数量
         */

        @XStreamAlias("ZMENG")
        private BigDecimal zmeng;

        /**
         * 已开票金额
         */

        @XStreamAlias("ZWRBTR")
        private BigDecimal zwrbtr;

        /**
         * 已到货日期
         */

        @XStreamAlias("BUDAT")
        private String budat;

        /**
         * 批准标识：采购凭证
         */

        @XStreamAlias("FRGKE")
        private String frgke;

        /**
         * 采购凭证中的删除标识
         */

        @XStreamAlias("LOEKZ")
        private String loekz;

        /**
         * 订单单位
         */

        @XStreamAlias("ZDDDW")
        private String zdddw;

        /**
         * 订单价格单位
         */

        @XStreamAlias("ZJGDW")
        private String zjgdw;

        /**
         * 价格单位
         */

        @XStreamAlias("PEINH")
        private String peinh;

        /**
         * 采购订单行项目文本
         */

        @XStreamAlias("HXMWB")
        private String hxmwb;

        /**
         * 采购凭证类型的简短描述
         */

        @XStreamAlias("BATXT")
        private String batxt;

        /**
         * 库存地点
         */

        @XStreamAlias("LGORT")
        private String lgort;

        /**
         * 仓储地点的描述
         */

        @XStreamAlias("LGOBE")
        private String lgobe;

        /**
         * 附加税值名
         */

        @XStreamAlias("TEXT1")
        private String text1;

        /**
         * 日期
         */

        @XStreamAlias("DATUM")
        private String datum;

        /**
         * 时间
         */

        @XStreamAlias("UZEIT")
        private String uzeit;

        /**
         * MES读取状态, 1已读，0未读
         */
        @ExcelIgnore
        @XStreamAlias("STATUS")
        private String status;

        /**
         * 用户权限id
         */
        @ExcelIgnore
        @XStreamAlias("UID")
        private String uid;
        /**
         * 凭证中的过账日期
         * 新增日期：2020-04-26
         * Author：lyf
         */

        @XStreamAlias("BUDAT_MKPF")
        private String budatMkpf;
        /**
         * 不含税净价金额
         * 新增日期：2021-02-25
         * Author：lyf
         */

        @XStreamAlias("NETPR")
        private String netpr;
        /**
         * 不含税净价金额总和
         * 新增日期：2021-02-25
         * Author：lyf
         */

        @XStreamAlias("SUM_NETPR")
        private String sumNetpr;


        @XStreamAlias("ZTERM")
        private String zterm;
        /**
         * 不含税净价金额总和
         * 新增日期：2021-03-17
         * Author：lyf
         */

        @XStreamAlias("NAME_LAST")
        private String nameLast;


        /**
         * 采购申请编号
         * 新增日期：2022-03-21
         * Author：lyf
         */

        @XStreamAlias("BANFN")
        private String banfn;


        /**
         * 采购申请的项目编号
         * 新增日期：2022-03-21
         * Author：lyf
         */

        @XStreamAlias("BNFPO")
        private String bnfpo;


        /**
         * 2022-04-19
         * 供应商使用的物料编号
         */

        @XStreamAlias("IDNLF")
        private String idnlf;

        /**
         * 2022-10-08
         * 工作分解结构元素
         */

        @XStreamAlias("POSID")
        private String posid;

        @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
        @XStreamAlias("create_time")
        private String createTime;
        /**
         * 2023-08-22
         * 采购申请请求日期
         */
        @XStreamAlias("BADAT")
        private String badat;
        /**
         * 2023-08-22
         * 集采编号
         */
        @XStreamAlias("URZZT")
        private String urzzt;

        @XStreamAlias("ZBSTNK")
        private String zbstnk;

        @XStreamAlias("AEDAT")
        private String aedat;

        @XStreamAlias("PROCSTAT")
        private String procstat;
    }


    @Data
    class Head implements Serializable {
        private static final long serialVersionUID = 1L;

        public Head(ZxjMesEbelnAO.ZxjMesEbeln zxjSrmEbeln) {
            this.ebeln = zxjSrmEbeln.getEbeln();
            this.ekorg = zxjSrmEbeln.getEkorg();
            this.bukrs = zxjSrmEbeln.getBukrs();
            this.ekgrp = zxjSrmEbeln.getEkgrp();
            this.lifnr = zxjSrmEbeln.getLifnr();
            this.gysmc = zxjSrmEbeln.getGysmc();
            this.bsart = zxjSrmEbeln.getBsart();
            this.aedat = zxjSrmEbeln.getAedat();
            this.procstat = zxjSrmEbeln.getProcstat();
            this.orderStatus = "1";
            this.ernam = zxjSrmEbeln.getErnam();
            this.createBy = zxjSrmEbeln.getErnam();
            this.createTime = zxjSrmEbeln.getAedat();
            this.frgke = zxjSrmEbeln.getFrgke();
            this.itemList = new ArrayList<>();
        }

        /**
         * 采购订单号
         */
        @JsonProperty(value = "poCode")
        @TableField("\"EBELN\"")
        private String ebeln;
        /**
         * 采购组织
         */
        @JsonProperty(value = "purchaseOrg")
        @TableField("\"EKORG\"")
        private String ekorg;
        /**
         * 公司编码
         */
        @JsonProperty(value = "companyCode")
        @TableField("\"BUKRS\"")
        private String bukrs;
        /**
         * 采购组
         */
        @JsonProperty(value = "purchaseGroup")
        @TableField("\"EKGRP\"")
        private String ekgrp;
        /**
         * 供应商编码
         */
        @JsonProperty(value = "supplierCode")
        @TableField("\"LIFNR\"")
        private String lifnr;
        /**
         * 供应商名称
         */
        @JsonProperty(value = "supplierName")
        @TableField("\"GYSMC\"")
        private String gysmc;
        /**
         * 订单类型
         */
        @JsonProperty(value = "orderType")
        @TableField("\"BSART\"")
        private String bsart;
        /**
         * 下达日期
         */
        @JsonProperty(value = "issuedDate")
        @TableField("\"AEDAT\"")
        private String aedat;
        /**
         * 批准标识
         */
        @JsonProperty(value = "approvalLogo")
        @TableField("\"PROCSTAT\"")
        private String procstat;
        /**
         * 订单状态(1-已确认 2-已完成)
         */
        @JsonProperty(value = "orderStatus")
        private String orderStatus;
        /**
         * 联系人
         */
        @JsonProperty(value = "contactsName")
        @TableField("\"ERNAM\"")
        private String ernam;
        /**
         * SAP创建人账号
         */
        @JsonProperty(value = "createBy")
        @TableField("\"ERNAM\"")
        private String createBy;
        /**
         * 创建时间
         */
        @JsonProperty(value = "createTime")
        @TableField("\"AEDAT\"")
        private String createTime;
        /**
         * 批准标识：采购凭证  X：已审核
         */
        @JsonProperty(value = "frgke")
        @TableField("\"FRGKE\"")
        private String frgke;


        @JsonProperty(value = "purchaseOrderLines")
        private List<Item> itemList;
    }

    @Data
    class Item implements Serializable {
        private static final long serialVersionUID = 1L;

        public Item(ZxjMesEbelnAO.ZxjMesEbeln zxjSrmEbeln) {
            this.ebeln = zxjSrmEbeln.getEbeln();
            this.ebelp = zxjSrmEbeln.getEbelp();
            this.zbstnk = zxjSrmEbeln.getZbstnk();
            this.matnr = com.xjgc.util.StringUtils.left0Trim(zxjSrmEbeln.getMatnr());
            this.txz01 = zxjSrmEbeln.getTxz01();
            this.meins = zxjSrmEbeln.getMeins();
            this.knttp = zxjSrmEbeln.getKnttp();
            this.vbeln = zxjSrmEbeln.getVbeln();
            this.vbelp = zxjSrmEbeln.getVbelp();
            this.menge = zxjSrmEbeln.getMenge();
            this.peinh = zxjSrmEbeln.getPeinh();
            //税率
            BigDecimal sl = BigDecimal.ZERO;
            if (null != zxjSrmEbeln.getText1()) {
                String text1 = zxjSrmEbeln.getText1();
                if (text1.contains("%")) {
                    String substring = text1.substring(0, text1.indexOf("%"));
                    String nStr = com.xjgc.util.StringUtils.extractNumberRight(substring);
                    if (StringUtils.isNotEmpty(nStr)) {
                        sl = new BigDecimal(nStr);
                        sl = sl.divide(new BigDecimal(100), 3, BigDecimal.ROUND_HALF_UP);
                    }
                }
            }
            /*TEXT1*/
            if (null != zxjSrmEbeln.getNetpr()) {
                this.price = new BigDecimal(zxjSrmEbeln.getNetpr()).multiply(BigDecimal.ONE.add(sl)).setScale(2, BigDecimal.ROUND_HALF_UP);
            } else {
                this.price = BigDecimal.ZERO;
            }


            /*需要改下计算公式：单价(不含税)NETPR *订单数量 MENGE /价格单位PEINH*/
            if (StringUtils.isNotBlank(zxjSrmEbeln.getNetpr()) && zxjSrmEbeln.getMenge() != null && StringUtils.isNotBlank(zxjSrmEbeln.getPeinh())) {
                this.orderAmount = new BigDecimal(zxjSrmEbeln.getNetpr()).multiply(zxjSrmEbeln.getMenge()).divide(new BigDecimal(zxjSrmEbeln.getPeinh()), 2, BigDecimal.ROUND_HALF_UP);
            } else {
                this.orderAmount = BigDecimal.ZERO;
            }

            /*if (null != zxjSrmEbeln.getBrtwr() && null != zxjSrmEbeln.getWemng()) {
                this.orderAmount = new BigDecimal(zxjSrmEbeln.getBrtwr()).multiply(BigDecimal.ONE.add(sl)).setScale(2, BigDecimal.ROUND_HALF_UP);
            } else {
                this.orderAmount = BigDecimal.ZERO;
            }*/


            this.contractCode = zxjSrmEbeln.getZbstnk();
            this.werks = zxjSrmEbeln.getWerks();
            this.lgort = zxjSrmEbeln.getLgort();
            this.eindt = zxjSrmEbeln.getEindt();
            this.zterm = zxjSrmEbeln.getZterm();
            this.ernam = zxjSrmEbeln.getErnam();
            this.aedat = zxjSrmEbeln.getAedat();
            if (null != zxjSrmEbeln.getWemng()) {
                this.wemng = zxjSrmEbeln.getWemng();
            } else {
                this.wemng = BigDecimal.ZERO;
            }
            //未收货数量 = 总数量-已收货数量
            this.unreceivedQty = this.menge.subtract(this.wemng);
            this.zwrbtr = zxjSrmEbeln.getZwrbtr();
            this.zmeng = zxjSrmEbeln.getZmeng();
            //未开票数量 = 订单总数量 - 已开票数量
            this.uninvoicedQty = this.menge.subtract(this.zmeng);
            this.netpr = zxjSrmEbeln.getNetpr();
            this.brtwr = zxjSrmEbeln.getBrtwr();
            this.mwskz = zxjSrmEbeln.getMwskz();
            this.loekz = zxjSrmEbeln.getLoekz();
            this.banfn = zxjSrmEbeln.getBanfn();
            this.bnfpo = zxjSrmEbeln.getBnfpo();
            this.idnlf = zxjSrmEbeln.getIdnlf();
            this.posid = zxjSrmEbeln.getPosid();
            this.zgcmc = zxjSrmEbeln.getZgcmc();
            this.bsart = zxjSrmEbeln.getBsart();
            this.budat = zxjSrmEbeln.getBudat();
            this.zdddw = zxjSrmEbeln.getZdddw();
            this.hxmwb = zxjSrmEbeln.getHxmwb();
            this.batxt = zxjSrmEbeln.getBatxt();
            this.lgobe = zxjSrmEbeln.getLgobe();
            this.text1 = zxjSrmEbeln.getText1();
            this.budatMkpf = zxjSrmEbeln.getBudatMkpf();
            this.sumNetpr = zxjSrmEbeln.getSumNetpr();
            this.znetpr = zxjSrmEbeln.getZnetpr();
            this.urzzt = zxjSrmEbeln.getUrzzt();
        }

        /**
         * 采购订单号
         */
        @JsonProperty(value = "poCode")
        @TableField("\"EBELN\"")
        private String ebeln;
        /**
         * 采购行项目号
         */
        @JsonProperty(value = "poLine")
        @TableField("\"EBELP\"")
        private String ebelp;
        /**
         * 采购合同号
         */
        @JsonProperty(value = "purchaseContractCode")
        @TableField("\"ZBSTNK\"")
        private String zbstnk;
        /**
         * 物料编码
         */
        @JsonProperty(value = "sapId")
        @TableField("\"MATNR\"")
        private String matnr;
        /**
         * 物料描述
         */
        @JsonProperty(value = "sapDescription")
        @TableField("\"TXZ01\"")
        private String txz01;
        /**
         * 物料单位
         */
        @JsonProperty(value = "unit")
        @TableField("\"MEINS\"")
        private String meins;
        /**
         * 科目分配类别(E-按单 B-按库)
         */
        @JsonProperty(value = "subjectCategory")
        @TableField("\"KNTTP\"")
        private String knttp;
        /**
         * 销售和分销凭证号
         */
        @JsonProperty(value = "saleCode")
        @TableField("\"VBELN\"")
        private String vbeln;
        /**
         * 销售行项目号
         */
        @JsonProperty(value = "saleLine")
        @TableField("\"VBELP\"")
        private String vbelp;
        /**
         * 订单数量
         */
        @JsonProperty(value = "orderQty")
        @TableField("\"MENGE\"")
        private BigDecimal menge;
        /**
         * 价格单位
         */
        @JsonProperty(value = "priceUnit")
        @TableField("\"PEINH\"")
        private String peinh;
        /**
         * 价格
         * 不含税价格*税率，保留两位小数	NETPR*MWSKZ
         */
        @JsonProperty(value = "price")
        private BigDecimal price;
        /**
         * 金额(元）
         * 不含税金额*税率，保留两位小数	BRTWR*MWSKZ
         */
        @JsonProperty(value = "orderAmount")
        private BigDecimal orderAmount;
        /**
         * 合同号
         */
        @JsonProperty(value = "contractCode")
        @TableField("\"ZBSTNK\"")
        private String contractCode;
        /**
         * 工厂
         */
        @JsonProperty(value = "plant")
        @TableField("\"WERKS\"")
        private String werks;
        /**
         * 库存地点
         */
        @JsonProperty(value = "storLocation")
        @TableField("\"LGORT\"")
        private String lgort;
        /**
         * 计划交货期
         */
        @JsonProperty(value = "deliveryDate")
        @TableField("\"EINDT\"")
        private String eindt;
        /**
         * 付款方式
         */
        @JsonProperty(value = "paymentMethod")
        @TableField("\"ZTERM\"")
        private String zterm;
        /**
         * 创建人
         */
        @JsonProperty(value = "createBy")
        @TableField("\"ERNAM\"")
        private String ernam;
        /**
         * 创建时间
         */
        @JsonProperty(value = "createTime")
        @TableField("\"AEDAT\"")
        private String aedat;
        /**
         * 已收货数量
         */
        @JsonProperty(value = "receivedQty")
        @TableField("\"WEMNG\"")
        private BigDecimal wemng;
        /**
         * 未收货数量
         * 总数量-已收货数量
         */
        @JsonProperty(value = "unreceivedQty")
        private BigDecimal unreceivedQty;
        /**
         * 已开票金额
         */
        @JsonProperty(value = "invoicedAmount")
        @TableField("\"ZWRBTR\"")
        private BigDecimal zwrbtr;
        /**
         * 已开票数量
         */
        @JsonProperty(value = "invoicedQty")
        @TableField("\"ZMENG\"")
        private BigDecimal zmeng;

        /**
         * 未开票数量
         * 未开票金额-已开票金额
         */
        @JsonProperty(value = "uninvoicedQty")
        private BigDecimal uninvoicedQty;
        /**
         * 单价(不含税)
         */
        @JsonProperty(value = "taxExclusivePrice")
        @TableField("\"NETPR\"")
        private String netpr;
        /**
         * 总价(不含税)
         */
        @JsonProperty(value = "taxExclusiveOrderAmount")
        @TableField("\"BRTWR\"")
        private String brtwr;
        /**
         * 税率
         */
        @JsonProperty(value = "rate")
        @TableField("\"MWSKZ\"")
        private String mwskz;
        /**
         * 采购凭证中的删除标识  L：已删除
         */
        @JsonProperty(value = "loekz")
        @TableField("\"LOEKZ\"")
        private String loekz;
        /**
         * 采购申请编号
         */
        @JsonProperty("purNumber")
        @TableField("\"BANFN\"")
        private String banfn;
        /**
         * 采购申请的项目编号
         */
        @JsonProperty("purItemNumber")
        @TableField("\"BNFPO\"")
        private String bnfpo;
        /**
         * 供应商使用的物料编号
         */
        @JsonProperty("supplierSapId")
        @TableField("\"IDNLF\"")
        private String idnlf;
        /**
         * 工作分解结构元素 (WBS 元素)
         */
        @JsonProperty("wbsElement")
        @TableField("\"POSID\"")
        private String posid;
        /**
         * 工厂名称
         */
        @JsonProperty("plantName")
        @TableField("\"ZGCMC\"")
        private String zgcmc;
        /**
         * 订单类型（采购）
         */
        @JsonProperty("orderType")
        @TableField("\"BSART\"")
        private String bsart;
        /**
         * 已到货日期
         */
        @JsonProperty("dateOfArrival")
        @TableField("\"BUDAT\"")
        private String budat;
        /**
         * 订单单位
         */
        @JsonProperty("oederUnit")
        @TableField("\"ZDDDW\"")
        private String zdddw;
        /**
         * 采购订单行项目文本
         */
        @JsonProperty("purOrderText")
        @TableField("\"HXMWB\"")
        private String hxmwb;
        /**
         * 采购凭证类型的简短描述
         */
        @JsonProperty("purProof")
        @TableField("\"BATXT\"")
        private String batxt;
        /**
         * 仓储地点的描述
         */
        @JsonProperty("storage")
        @TableField("\"LGOBE\"")
        private String lgobe;
        /**
         * 附加税值名
         */
        @JsonProperty("additionName")
        @TableField("\"TEXT1\"")
        private String text1;
        /**
         * 凭证中的过帐日期
         */
        @JsonProperty("postingAccountsDate")
        @TableField("\"BUDAT_MKPF\"")
        private String budatMkpf;
        /**
         * 凭证货币计量的净价值
         */
        @JsonProperty("monetaryValue")
        @TableField("\"SUM_NETPR\"")
        private String sumNetpr;
        /**
         * 采购订单货币的订单净值
         */
        @JsonProperty("purOrderMonetaryValue")
        @TableField("\"ZNETPR\"")
        private String znetpr;

        /**
         * 采购项目编号字段
         */
        @JsonProperty(value = "projectNumber")
        @TableField("\"URZZT\"")
        private String urzzt;
    }
}
